package org.cybzacg.convert.listener;

import org.cybzacg.convert.context.ConversionContext;

/**
 * 转换监听器接口
 * 用于监听转换过程中的各种事件
 *
 * @author cybzacg.blog
 * @version 3.0
 * @since 3.0
 */
public interface ConversionListener {

    /**
     * 转换开始事件
     *
     * @param context 转换上下文
     * @param source  源对象
     */
    void onConversionStart(ConversionContext context, Object source);

    /**
     * 转换成功事件
     *
     * @param context 转换上下文
     * @param source  源对象
     * @param result  转换结果
     */
    void onConversionSuccess(ConversionContext context, Object source, Object result);

    /**
     * 转换失败事件
     *
     * @param context   转换上下文
     * @param source    源对象
     * @param exception 异常信息
     */
    void onConversionFailure(ConversionContext context, Object source, Exception exception);

    /**
     * 转换完成事件（无论成功或失败）
     *
     * @param context   转换上下文
     * @param source    源对象
     * @param result    转换结果（失败时为null）
     * @param exception 异常信息（成功时为null）
     */
    void onConversionComplete(ConversionContext context, Object source, Object result, Exception exception);

    /**
     * 缓存命中事件
     *
     * @param context      转换上下文
     * @param source       源对象
     * @param cachedResult 缓存结果
     */
    void onCacheHit(ConversionContext context, Object source, Object cachedResult);

    /**
     * 缓存未命中事件
     *
     * @param context 转换上下文
     * @param source  源对象
     */
    void onCacheMiss(ConversionContext context, Object source);

    /**
     * 验证开始事件
     *
     * @param context 转换上下文
     * @param value   待验证值
     */
    void onValidationStart(ConversionContext context, Object value);

    /**
     * 验证成功事件
     *
     * @param context 转换上下文
     * @param value   验证通过的值
     */
    void onValidationSuccess(ConversionContext context, Object value);

    /**
     * 验证失败事件
     *
     * @param context   转换上下文
     * @param value     验证失败的值
     * @param exception 验证异常
     */
    void onValidationFailure(ConversionContext context, Object value, Exception exception);

    /**
     * 获取监听器名称
     *
     * @return 监听器名称
     */
    default String getName() {
        return this.getClass().getSimpleName();
    }

    /**
     * 检查是否启用
     *
     * @return 是否启用
     */
    default boolean isEnabled() {
        return true;
    }

    /**
     * 抽象监听器适配器
     * 提供默认的空实现，方便用户只监听特定事件
     */
    abstract class Adapter implements ConversionListener {

        @Override
        public void onConversionStart(ConversionContext context, Object source) {
            // 默认空实现
        }

        @Override
        public void onConversionSuccess(ConversionContext context, Object source, Object result) {
            // 默认空实现
        }

        @Override
        public void onConversionFailure(ConversionContext context, Object source, Exception exception) {
            // 默认空实现
        }

        @Override
        public void onConversionComplete(ConversionContext context, Object source, Object result, Exception exception) {
            // 默认空实现
        }

        @Override
        public void onCacheHit(ConversionContext context, Object source, Object cachedResult) {
            // 默认空实现
        }

        @Override
        public void onCacheMiss(ConversionContext context, Object source) {
            // 默认空实现
        }

        @Override
        public void onValidationStart(ConversionContext context, Object value) {
            // 默认空实现
        }

        @Override
        public void onValidationSuccess(ConversionContext context, Object value) {
            // 默认空实现
        }

        @Override
        public void onValidationFailure(ConversionContext context, Object value, Exception exception) {
            // 默认空实现
        }
    }
}
